package intermouse;

import java.io.Console;
import java.util.Random;
import java.util.List;

/**
 * A hangyákat időnként megtámadó hangyászsünt jelképező osztály.
 * 
 * @author Bendefy Zoltán
 * @version 1.0
 * @since 2013-03-23
 */
public class AntEater extends Malicious {
	/**
	 * Azt tároljuk benne, hogy a hangyászsün még hány hangyát kíván
	 * elfogyasztani.
	 */
	private int antsToEat;

	/**
	 * Az aktuális irányt tároljuk benne, amerre a sün megy.
	 * 0 = North 
	 * 1 = NorthEast       
	 * 2 = East
	 * ...
	 * 5 = NorthWest
	 */
	private int direction;

	/**
	 * Ebben a változóban tároljuk, hogy a sün épp a képernyőn van-e vagy sem.
	 */
	private boolean hidden;

	/**
	 * Konstruktor
	 * 
	 * A AntEater osztály konstruktora.
	 */
	AntEater() {
		super();
		respawnable = true;
		antsToEat = 0;
		direction = 0;
		hidden = true;
	}

	/**
	 * Ebben a kívülről hívott metódusban futnak le a hangyászsün objektum
	 * körben végzett tevékenységei.
	 * 
	 * Ez a függvény felelős azért, hogy a hangyászsün objektum minden, az adott
	 * körben elvégzendő tevékenységet végrehajtson. Ebben zajlik le a támadás,
	 * a mozgás, a falnak ütközés vizsgálata, a sün éhségének vizsgálata, stb.
	 * 
	 * @return A függvény void-dal tér vissza, miután minden cselekvést
	 *         elvégzett.
	 */
	public void beginRound() {
		System.out.println(">> AntEater.beginRound() : void");
		
		if (getField() == null) 
		{
			System.out.println("Figyelem! Az objektum field-je null!");
			return;
		}
		if (hidden) return;
		
		//Ha már teli van a sün, akkor csak mozogni tud, enni nem. Azaz a hangyákon átlép. Egyénbként támad
		if (antsToEat > 0) 
		{
			boolean attackSucceded = beginAttack();
			if (attackSucceded) 
			{
				antsToEat--;
				TestCommandParser.log("AntEater’s antsToEat decreases to "+((Integer)antsToEat).toString()+".");
			}
		}
		
		//Sün mozgása:
		List<Field> adjFields = field.getAdjacentFields();
		
		Field tryStep = adjFields.get(direction);
		
		if (tryStep == null) //null azt jelenti, hogy az adott irányba nincs Field, így oda nem lehet lépni.
		{
			System.out.println("Figyelem! Az AntEater nem tud a megadott irányba lépni! Vagy nem találkozott Edge-el ami visszafordítaná, vagy az Edge hatására nem fordult el más irányba.");
			return;
		}
		
		if (tryStep.canStep(this, direction))
		{
			TestCommandParser.log("AntEater moves from "+ this.field.toString() +" to "+tryStep.toString()+".");
			setField(tryStep);
		}
		else
		{
			//Ha edge-re lépünk
			if (antsToEat <= 0)
			{
				this.hidden = true;
				TestCommandParser.log("AntEater disappears at " + tryStep.toString());
			}
			else
			{
				if (GameState.getUseRandomSteps())
				{
					Random rgen = new Random( 1958042 );
					boolean exit = false;
					int tries = 0;
					
					while(!exit)
					{
						tries++;
						int i = rgen.nextInt(6);
						if (adjFields.get(i) != null && i != direction) //új direction-t sorsolunk (itt most determinisztikusság miatt az első ami nem az aktuális irány lesz az új)
						{
							direction = i;
							exit = true;
							break;
						}
						if (tries >= 16) //16 sikertelen próba után feladjuk, és sikertelennek nyilvánítjuk a lépést.
						{
							exit = true;
							break;
						}
					}
				}
				else
				{
					for (int i = 0; i < adjFields.size(); i++)
					{
						if (adjFields.get(i) != null && i != direction) //új direction-t sorsolunk (itt most determinisztikusság miatt az első ami nem az aktuális irány lesz az új)
						{
							direction = i;
							break;
						}
					}
				}
			}
		}	
	
		System.out.println("<< return");
	}
	
	/**
	 * Ezzel a metódussal lehet felhelyezni az AntEater objektumot a játéktérre
	 * 
	 * Ez a metódus helyezi fel az objektumot a pályára. Beállítja a field
	 * változó értékét a paraméterben megadottra, majd egyéb inicializálásokat
	 * végez.
	 * 
	 * @param field
	 *            A mező amelyre az objektumot helyezni fogjuk
	 * @return A függvény egy void-dal tér vissza
	 */
	public void spawn(Field field) {
		System.out.println(">> AntEater.spawn(Field) : void");
		
		if (!respawnable && getField() != null) return;
		if (!hidden) return;
		
		TestCommandParser.log("Activated AntEater at " + field.toString());
		TestCommandParser.log("AntEater appears at " + field.toString());
		
		hidden = false;
		if (GameState.getUseRandomSteps())
		{
			Random rgen = new Random( 19580427 );
			direction = rgen.nextInt(6); //random 0-5
			antsToEat = rgen.nextInt(3) + 2; //random 2-4
		}
		else
		{
			direction = 2; //random 0-5
			antsToEat = 3; //random 2-4
		}
		
		setField(field);
		
		TestCommandParser.log("Spawned AntEater at "+field.toString()+".");
		
		System.out.println("<< return");
	}
}
